from django.db import models


class GoodsChannelGroup(models.Model):
    """商品频道组"""

    name = models.CharField(max_length=20, verbose_name="频道组名")

    class Meat:
        db_table = "tb_channel_group"
        verbose_name = "商品频道组"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class GoodsCategory(models.Model):
    """商品类别"""
    name = models.CharField(max_length=10, verbose_name="名称")
    parent = models.ForeignKey("self", related_name="subs", null=True, blank=True, on_delete=models.CASCADE,
                               verbose_name="父类别")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = "tb_goods_category"
        verbose_name = "商品类别"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class GoodsChannel(models.Model):
    """商品频道"""
    group = models.ForeignKey(GoodsChannelGroup, verbose_name="频道组名")
    category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name="顶级商品类别")
    url = models.CharField(max_length=50, verbose_name="频道页面链接")
    sequence = models.IntegerField(verbose_name="组内顺序")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = "tb_goods_channel"
        verbose_name = "商品频道"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.category.name


class Brand(models.Model):
    """品牌"""
    name = models.CharField(max_length=20, verbose_name="名称")
    logo = models.CharField(max_length=200, verbose_name="Logo图片")
    first_letter = models.CharField(max_length=1, verbose_name="品牌首字母")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = "tb_brand"
        verbose_name = "品牌"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class SPU(models.Model):
    """商品SPU"""
    name = models.CharField(max_length=50, verbose_name="名称")
    brand = models.ForeignKey(Brand, on_delete=models.PROTECT, verbose_name="品牌")
    category1 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name="cat1_spu", verbose_name="一级分类")
    category2 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name="cat2_spu", verbose_name="二级分类")
    category3 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name="cat3_spu", verbose_name="三级分类")
    sales = models.IntegerField(default=0, verbose_name="销量")
    comments = models.IntegerField(default=0, verbose_name="评价数")
    desc_detail = models.TextField(default='', verbose_name="详情介绍")  # 商品详情 说明书
    desc_pack = models.TextField(default='', verbose_name="包装介绍")  # 包装规格
    desc_service = models.TextField(default='', verbose_name="售后服务")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = "tb_spu"
        verbose_name = "商品SPU"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class SKU(models.Model):
    """商品SKU"""
    name = models.CharField(max_length=50, verbose_name='名称')
    caption = models.CharField(max_length=100, verbose_name='副标题')
    spu = models.ForeignKey(SPU, on_delete=models.CASCADE, verbose_name='商品')
    category = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, verbose_name='从属类别')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='单价')
    cost_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='进价')
    market_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='市场价')
    stock = models.IntegerField(default=0, verbose_name='库存')
    sales = models.IntegerField(default=0, verbose_name='销量')
    comments = models.IntegerField(default=0, verbose_name='评价数')
    is_launched = models.BooleanField(default=True, verbose_name='是否上架销售')
    default_image = models.CharField(max_length=200, default='', null=True, blank=True, verbose_name='默认图片')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = 'tb_sku'
        verbose_name = '商品SKU'
        verbose_name_plural = verbose_name

    def __str__(self):
        return '%s: %s' % (self.id, self.name)


class SKUImage(models.Model):
    """SKU图片"""
    sku = models.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name="sku")
    image = models.CharField(max_length=200, verbose_name="图片")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = 'tb_sku_image'
        verbose_name = 'SKU图片'
        verbose_name_plural = verbose_name

    def __str__(self):
        return '%s %s' % (self.sku.name, self.id)


class SPUSpecification(models.Model):
    """商品SPU规格"""
    spu = models.ForeignKey(SPU, on_delete=models.CASCADE, related_name="specs", verbose_name="商品SPU")
    name = models.CharField(max_length=20, verbose_name="规格名称")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = 'tb_spu_specification'
        verbose_name = '商品SPU规格'
        verbose_name_plural = verbose_name

    def __str__(self):
        return '%s: %s' % (self.spu.name, self.name)


class SpecificationOption(models.Model):
    """规格选项"""
    spec = models.ForeignKey(SPUSpecification, related_name="options", on_delete=models.CASCADE, verbose_name="规格")
    value = models.CharField(max_length=20, verbose_name="选项值")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = 'tb_specification_option'
        verbose_name = '规格选项'
        verbose_name_plural = verbose_name

    def __str__(self):
        return '%s - %s' % (self.spec, self.value)


class SKUSpecification(models.Model):
    """SKU具体规格"""
    sku = models.ForeignKey(SKU, related_name="specs", on_delete=models.CASCADE, verbose_name="sku")
    spec = models.ForeignKey(SPUSpecification, on_delete=models.PROTECT, verbose_name="规格名称")
    option = models.ForeignKey(SpecificationOption, on_delete=models.PROTECT, verbose_name="规格值")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        db_table = 'tb_sku_specification'
        verbose_name = 'SKU规格'
        verbose_name_plural = verbose_name

    def __str__(self):
        return '%s: %s - %s' % (self.sku, self.spec.name, self.option.value)
